perm filename PRIMES.PAS[S1,ALS] blob sn#392597 filedate 1978-11-07 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	(*$L+*)
C00004 ENDMK
CāŠ—;
(*$L+*)
PROGRAM PRIMES(OUTPUT); (* Modified copy from Wirth p 54* for the PDP-10*)
CONST
  WDLENGTH = 36;  MAXBIT = 35;  W = 100; (* To find primes below 3600*)
VAR
  SIEVE,PRIMES : ARRAY[0..W] OF SET OF 0..MAXBIT;
  NEXT : RECORD WORD,BIT : INTEGER  END;
  J,K,T,C : INTEGER;
  EMPTY : BOOLEAN;
BEGIN
FOR T := 0 TO W DO BEGIN SIEVE[T] := [0..MAXBIT]; PRIMES[T] := [] END;
SIEVE[0] := SIEVE[0] - [0]; NEXT.WORD := 0; NEXT.BIT := 1;  EMPTY := FALSE;
WITH NEXT DO REPEAT
  WHILE NOT (BIT IN SIEVE[WORD]) DO BIT := SUCC(BIT);
  PRIMES[WORD] := PRIMES[WORD] + [BIT];
  C := 2*BIT + 1; J := BIT;  K := WORD;
  WHILE K<=W DO BEGIN
    SIEVE[K] := SIEVE[K] - [J];  K := K + WORD*2;  J := J+C;
    WHILE J>MAXBIT DO BEGIN  K :=K+1; J :=J - WDLENGTH END
  END;
  IF SIEVE[WORD] = [] THEN BEGIN EMPTY := TRUE; BIT := 0 END;
  WHILE EMPTY AND (WORD<W) DO BEGIN
    WORD := WORD + 1; EMPTY := SIEVE[WORD] = [] END
  UNTIL EMPTY;
END.